/**
 * 版本号比较工具类
 */
class VersionUtils {
  /**
   * 比较两个版本号
   * @param version1 第一个版本号，如 "1.2.3"
   * @param version2 第二个版本号，如 "1.2.4"
   * @returns 比较结果
   *   - 如果 version1 > version2，返回 1
   *   - 如果 version1 < version2，返回 -1
   *   - 如果 version1 == version2，返回 0
   */
  static compareVersions(version1: string, version2: string): number {
    // 分割版本号
    const components1 = version1.split('.');
    const components2 = version2.split('.');
    
    // 确保两个版本号有相同的段数
    const maxLength = Math.max(components1.length, components2.length);
    const normalized1 = this.normalizeVersionComponents(components1, maxLength);
    const normalized2 = this.normalizeVersionComponents(components2, maxLength);
    
    // 逐段比较
    for (let i = 0; i < maxLength; i++) {
      const num1 = parseInt(normalized1[i], 10) || 0;
      const num2 = parseInt(normalized2[i], 10) || 0;
      
      if (num1 > num2) {
        return 1;
      } else if (num1 < num2) {
        return -1;
      }
    }
    
    return 0;
  }
  
  /**
   * 标准化版本号组件，确保所有版本号有相同的段数
   * @param components 版本号组件数组
   * @param length 目标长度
   * @returns 标准化后的版本号组件数组
   */
  private static normalizeVersionComponents(components: string[], length: number): string[] {
    const normalized = [...components];
    while (normalized.length < length) {
      normalized.push('0');
    }
    return normalized;
  }
  
  /**
   * 检查版本号是否有效
   * @param version 要检查的版本号
   * @returns 是否有效
   */
  static isValidVersion(version: string): boolean {
    const pattern = /^\d+(\.\d+)*$/;
    return pattern.test(version);
  }
  
  /**
   * 检查是否需要更新
   * @param currentVersion 当前版本
   * @param latestVersion 最新版本
   * @returns 是否需要更新
   */
  static needUpdate(currentVersion: string, latestVersion: string): boolean {
    if (!this.isValidVersion(currentVersion) || !this.isValidVersion(latestVersion)) {
      return false;
    }
    return this.compareVersions(currentVersion, latestVersion) < 0;
  }
  
  /**
   * 获取版本号的主要部分（major）
   * @param version 版本号
   * @returns 主要版本号
   */
  static getMajorVersion(version: string): number {
    const components = version.split('.');
    return parseInt(components[0], 10) || 0;
  }
  
  /**
   * 获取版本号的次要部分（minor）
   * @param version 版本号
   * @returns 次要版本号
   */
  static getMinorVersion(version: string): number {
    const components = version.split('.');
    return parseInt(components[1], 10) || 0;
  }
  
  /**
   * 获取版本号的修订部分（patch）
   * @param version 版本号
   * @returns 修订版本号
   */
  static getPatchVersion(version: string): number {
    const components = version.split('.');
    return parseInt(components[2], 10) || 0;
  }
}

export default VersionUtils; 